{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "1dae6d17",
   "metadata": {},
   "source": [
    "# 函数初尝试\n",
    "\n",
    "```{admonition} 需求\n",
    "学习函数的定义和调用的初尝试。\n",
    "```\n",
    "\n",
    "```{hint}\n",
    "{guilabel}`视频`\n",
    "\n",
    "- [C++ 函数与类型](https://www.bilibili.com/video/BV1RS4y1M7UG/)\n",
    "```\n",
    "\n",
    "回顾 [流程控制](controlflow) 中使用的代码块会发现：有一些代码块被反复使用，每次编写同样的代码片段，完全在做低效的工作。\n",
    "\n",
    "**函数** （function）是一个具名的语句序列，能够返回计算结果（称为 **返回值**）。\n",
    "\n",
    "通俗地说，把那些重复使用的代码块起一个名字（即函数名），后面直接使用该名字来执行其所代表的代码块。可以看出：函数的语义与变量很相似。\n",
    "\n",
    "使用函数的好处，出来开头说的那些外，还有：\n",
    "\n",
    "- 实现计算逻辑的分离；\n",
    "- 通过函数名可以表达更清晰的逻辑；\n",
    "- 利用函数，高效利用和组织代码；\n",
    "- 减少调试的工作量。\n",
    "\n",
    "看看如何编写求平方的运算："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "26f673b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "int square(int x) {\n",
    "    return x * x; // 返回 x 的平方\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e6e05106",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "square(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8a2098dc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "400"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "square(20)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bbb0615",
   "metadata": {},
   "source": [
    "## 函数定义\n",
    "\n",
    "**函数定义** 的语法描述：\n",
    "\n",
    "```cpp\n",
    "类型 函数名(参数表) 函数体\n",
    "```\n",
    "\n",
    "其中 `类型` 是函数的返回值的类型，`函数名` 是函数的标记，括号内是 `参数表`，`函数体` 是实现函数功能的语句。\n",
    "\n",
    "`参数表` （parameter list）的每个元素称为一个 **参数** （parameter）或 **形式参数** （formal argument），`参数表` 可以为空。如果不需要函数返回任何结果，返回值类型可以设定为 `void`。比如：\n",
    "\n",
    "```cpp\n",
    "void xxx(void) {\n",
    "    cout << \"Hi!\";\n",
    "}\n",
    "```\n",
    "\n",
    "这个函数的细节先不用关心，后面再介绍。\n",
    "\n",
    "## 函数声明\n",
    "\n",
    "如何不关注函数的细节，仅仅使用函数的话，C++ 提供了一种与函数定义分离的方法来显示函数的信息，称为 **函数声明** （function declaration）。\n",
    "\n",
    "比如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "12006316",
   "metadata": {},
   "outputs": [],
   "source": [
    "int square(int x); // 声明函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a93c3cf",
   "metadata": {},
   "source": [
    "```{note}\n",
    "这里的 `;` 表示函数体，相当于一个空的函数体。\n",
    "```\n",
    "\n",
    "关于函数声明的细节，后面再展开。\n",
    "\n",
    "## `main` 函数\n",
    "\n",
    "每个 C++ 程序必须有一个名为 `main` 的全局函数，它是程序执行的起点。若返回 `int` 类型，则它是程序返回给“系统”的值。如果不返回任何内容，则系统会收到一个表示程序成功完成的值；若返回非零值，则表示程序执行失败。\n",
    "\n",
    "下面的代码便是最小单元的程序："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ed13b943",
   "metadata": {},
   "outputs": [],
   "source": [
    "int main {}"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++11",
   "language": "C++11",
   "name": "python3100jvsc74a57bd0a2954483fe4136a94bd721da8601251ae4c667fedb6adcfe70ff0183b19bacbc"
  },
  "language_info": {
   "codemirror_mode": "text/x-c++src",
   "file_extension": ".cpp",
   "mimetype": "text/x-c++src",
   "name": "c++",
   "version": "11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
